using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>FAA 18B</para>
    /// <para>Creates obstruction identification surfaces (OIS) based on the FAA Advisory Circular 150/5300-18B specification. These OIS assist in the identification of possible hazards to air navigation and critical approach/departure obstructions within the vicinity of the airport and are used to support planning and design activities. The type, function, and dimension of a surface differ by its runway classification. This tool creates surfaces such as a polygon or multipatch features</para>
    /// <para>根据 FAA 咨询通告 150/5300-18B 规范创建障碍物识别表面 （OIS）。这些OIS有助于识别机场附近可能对空中航行和关键进近/离场障碍物的危害，并用于支持规划和设计活动。表面的类型、功能和尺寸因跑道分类而异。此工具可创建曲面或多面体要素等曲面</para>
    /// </summary>    
    [DisplayName("FAA 18B")]
    public class FAA18B : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public FAA18B()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_target">
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// </param>
        /// <param name="_runway_type">
        /// <para>Runway Classification</para>
        /// <para><xdoc>
        ///   <para>Specifies the runway classification of Input Runway Features.</para>
        ///   <bulletList>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_1 —A runway designed for visual maneuvers, nonvertically guided operations, and instrument departure procedures.</bullet_item><para/>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_2—A specially prepared hard surface (SPHS) runway designed for visual maneuvers, nonvertically guided operations, and instrument departure procedures. SPHS runways have a primary surface that extends 200 feet beyond each end of the runway.</bullet_item><para/>
        ///     <bullet_item>VERTICAL_GUIDANCE —A runway that uses precision guidance systems to support aircraft approach and landing.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入跑道要素的跑道分类。</para>
        ///   <bulletList>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_1 - 专为目视机动、非垂直制导操作和仪表起飞程序而设计的跑道。</bullet_item><para/>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_2 - 专门准备的硬表面 （SPHS） 跑道，专为目视机动、非垂直制导操作和仪表起飞程序而设计。SPHS 跑道的主表面延伸到跑道两端之外 200 英尺。</bullet_item><para/>
        ///     <bullet_item>VERTICAL_GUIDANCE —使用精确制导系统支持飞机进近和着陆的跑道。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public FAA18B(object _in_features, object _target, _runway_type_value? _runway_type)
        {
            this._in_features = _in_features;
            this._target = _target;
            this._runway_type = _runway_type;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "FAA 18B";

        public override string CallName => "aviation.FAA18B";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_features, _target, _runway_type.GetGPValue(), _highend_clear_way_length, _lowend_clear_way_length, _airport_elevation, _include_merged_surface.GetGPValue(), _derived_outfeatureclass, _custom_json_file, _airport_control_point_feature_class];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target { get; set; }


        /// <summary>
        /// <para>Runway Classification</para>
        /// <para><xdoc>
        ///   <para>Specifies the runway classification of Input Runway Features.</para>
        ///   <bulletList>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_1 —A runway designed for visual maneuvers, nonvertically guided operations, and instrument departure procedures.</bullet_item><para/>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_2—A specially prepared hard surface (SPHS) runway designed for visual maneuvers, nonvertically guided operations, and instrument departure procedures. SPHS runways have a primary surface that extends 200 feet beyond each end of the runway.</bullet_item><para/>
        ///     <bullet_item>VERTICAL_GUIDANCE —A runway that uses precision guidance systems to support aircraft approach and landing.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入跑道要素的跑道分类。</para>
        ///   <bulletList>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_1 - 专为目视机动、非垂直制导操作和仪表起飞程序而设计的跑道。</bullet_item><para/>
        ///     <bullet_item>NON_VERTICAL_GUIDANCE_TYPE_2 - 专门准备的硬表面 （SPHS） 跑道，专为目视机动、非垂直制导操作和仪表起飞程序而设计。SPHS 跑道的主表面延伸到跑道两端之外 200 英尺。</bullet_item><para/>
        ///     <bullet_item>VERTICAL_GUIDANCE —使用精确制导系统支持飞机进近和着陆的跑道。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Classification")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _runway_type_value? _runway_type { get; set; }

        public enum _runway_type_value
        {
            /// <summary>
            /// <para>Non vertical guidance type 1</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Non vertical guidance type 1")]
            [GPEnumValue("NON_VERTICAL_GUIDANCE_TYPE_1")]
            _NON_VERTICAL_GUIDANCE_TYPE_1,

            /// <summary>
            /// <para>Non vertical guidance type 2</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Non vertical guidance type 2")]
            [GPEnumValue("NON_VERTICAL_GUIDANCE_TYPE_2")]
            _NON_VERTICAL_GUIDANCE_TYPE_2,

            /// <summary>
            /// <para>Vertical guidance</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Vertical guidance")]
            [GPEnumValue("VERTICAL_GUIDANCE")]
            _VERTICAL_GUIDANCE,

        }

        /// <summary>
        /// <para>Length of High Runway End Clearway</para>
        /// <para>The length of the area at the high end of the runway. The unit of measurement is based on the input runway features.</para>
        /// <para>跑道高端区域的长度。测量单位基于输入跑道特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length of High Runway End Clearway")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _highend_clear_way_length { get; set; } = 0;


        /// <summary>
        /// <para>Length of Low Runway End Clearway</para>
        /// <para>The length of the area at the low end of the runway. The unit of measurement is based on the input runway features.</para>
        /// <para>跑道低端区域的长度。测量单位基于输入跑道特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length of Low Runway End Clearway")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _lowend_clear_way_length { get; set; } = 0;


        /// <summary>
        /// <para>Airport Elevation</para>
        /// <para>The highest elevation on any of the runways of the airport. The value should be given in the vertical coordinate system linear units of the target feature class. If no value is given, the highest point on the Input Runway Features will be used.</para>
        /// <para>机场任何跑道上的最高海拔。该值应以目标要素类的垂直坐标系线性单位给出。如果未给出任何值，则将使用输入跑道要素上的最高点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Airport Elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _airport_elevation { get; set; } = 0;


        /// <summary>
        /// <para>Include Merged Surfaces</para>
        /// <para><xdoc>
        ///   <para>Indicates whether merged horizontal and conical surfaces are included in the OIS in addition to the regular surfaces.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Include merged surfaces in the OIS output. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Do not include merged surfaces in the OIS output.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指示除常规曲面外，OIS 中是否还包括合并的水平曲面和锥形曲面。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 （Checked） - 在 OIS 输出中包括合并曲面。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 （Unchecked） - 在 OIS 输出中不包括合并曲面。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Merged Surfaces")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _include_merged_surface_value _include_merged_surface { get; set; } = _include_merged_surface_value._true;

        public enum _include_merged_surface_value
        {
            /// <summary>
            /// <para>INCLUDE_MERGED_SURFACE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("INCLUDE_MERGED_SURFACE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_INCLUDE_MERGED_SURFACE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_INCLUDE_MERGED_SURFACE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_outfeatureclass { get; set; }


        /// <summary>
        /// <para>Custom JSON File</para>
        /// <para>The import configuration, in JSON format, that creates the custom OIS.</para>
        /// <para>用于创建自定义 OIS 的 JSON 格式的导入配置。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Custom JSON File")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _custom_json_file { get; set; } = null;


        /// <summary>
        /// <para>Input Airport Control Point Feature</para>
        /// <para>The point features containing an Airport Elevation feature, displaced threshold features, or both. Values provided for the Airport Elevation parameter will take precedence over these point features.</para>
        /// <para>包含机场高程要素和/或位移阈值要素的点要素。为机场高程参数提供的值将优先于这些点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Airport Control Point Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _airport_control_point_feature_class { get; set; } = null;


        public FAA18B SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}